<?php

class AuthController extends AuthControllerCore
{

	public function preProcess()
	{
		global $currentIndex, $link;
		
		if (self::$cookie->isLogged() AND !Tools::isSubmit('ajax'))
			Tools::redirect('my-account.php');

		if (Tools::isSubmit('submitAccount'))
		{
			session_start();
			$create_account = 1;
			if (Tools::isSubmit('submitAccount'))
				self::$smarty->assign('email_create', 1);
			
			/* check username validate */
			$username = Tools::getValue('username');
			if (empty($username))
				$this->errors[] = Tools::displayError('Tên đăng nhập không được để trống !');
			elseif (strlen($username)<6 OR strlen($username)>12)
				$this->errors[] = Tools::displayError('Tên đăng nhập từ 6-12 ký tự !');
			elseif (Customer::usernameExists($username))
				$this->errors[] = Tools::displayError('Tên đăng nhập đã tồn tại .');
				
			/* check pass validate */
			$pass = Tools::getValue('passwd');
			if (empty($pass))
				$this->errors[] = Tools::displayError('Mật khẩu không được để trống !');
			elseif (strlen($pass)<6 OR strlen($pass)>12)
				$this->errors[] = Tools::displayError('Mật khẩu từ 6-12 ký tự !');
				
			/* check email validate */
			$email = Tools::getValue('email');
			if (empty($email))
				$this->errors[] = Tools::displayError('Email không được để trống !');
			elseif (!Validate::isEmail($email))
				$this->errors[] = Tools::displayError('Địa chỉ Email chưa đúng định dạng !');
			elseif (Customer::customerExists($email))
				$this->errors[] = Tools::displayError('Email đã tồn tại !');
				
			/* check fullname validate */
			$fullname = Tools::getValue('name');
			if (empty($fullname))
				$this->errors[] = Tools::displayError('Họ và tên không được để trống !');
				
			/* check address validate */
			$address = Tools::getValue('address');
			if (empty($address))
				$this->errors[] = Tools::displayError('Địa chỉ không được để trống !');
			/* check phone number */	
			if (!Tools::getValue('phone'))
				$this->errors[] = Tools::displayError('Số điện thoại của bạn chưa đúng !');
			
			/* Preparing customer */
			$customer = new Customer();
			
			if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) AND !(Tools::getValue('months') == '' AND Tools::getValue('days') == '' AND Tools::getValue('years') == ''))
				$this->errors[] = Tools::displayError('Ngày sinh không tồn tại !');
			$customer->birthday = (empty($_POST['years']) ? '' : (int)($_POST['years']).'-'.(int)($_POST['months']).'-'.(int)($_POST['days']));
			
			/* get id parent customer of new account */
			if (isset($_POST['parent']) AND $_POST['parent']){
				$id_parent = DB::getInstance()->getRow('SELECT id_customer FROM '._DB_PREFIX_.'customer WHERE username="'.$_POST['parent'].'"');
				if (isset($id_parent) AND $id_parent)
					$customer->parent = $id_parent['id_customer'];
				else 
					$customer->parent = 0;
			}
			if (!isset($_POST['code']) OR $_POST['code'] != $_SESSION['security_code'])
				$this->errors[] = Tools::displayError('Mã xác nhận chưa chính xác !');
			
			if (!isset($_POST['agree']))
				$this->errors[] = Tools::displayError('Bạn chưa đồng ý các điều khoản của website !');
				
			$this->errors = array_unique(array_merge($this->errors, $customer->validateControler()));
			
 			if (!sizeof($this->errors))
			{
				$customer->username = $_POST['username'];
				$customer->name = $_POST['name'];
				$customer->phone = $_POST['phone'];
				$customer->address = $_POST['address'];
				$customer->city = $_POST['city'];
				$customer->code = $_POST['code'];
				$customer->active = 1;
				if (!$customer->add())
					$this->errors[] = Tools::displayError('An error occurred while creating your account.');
				else
				{
					if (!Mail::Send((int)self::$cookie->id_lang, 'account', Mail::l('Welcome!', (int)self::$cookie->id_lang),
					array('{firstname}' => $customer->username, '{lastname}' => '', '{email}' => $customer->email, '{passwd}' => Tools::getValue('passwd')), $customer->email, $customer->name))
						$this->errors[] = Tools::displayError('Cannot send email');

					unset($_SESSION['security_code']);
					self::$smarty->assign('confirmation', 1);
					self::$cookie->id_customer = (int)($customer->id);
					self::$cookie->fullname = $customer->name;
					self::$cookie->passwd = $customer->passwd;
					self::$cookie->logged = 1;
					self::$cookie->email = $customer->email;
					self::$cookie->is_guest = !Tools::getValue('is_new_customer', 1);
					Module::hookExec('createAccount', array(
						'_POST' => $_POST,
						'newCustomer' => $customer
					));
					
					if ($back = Tools::getValue('back'))
						Tools::redirect($back);
					Tools::redirect('my-account.php');
				}
			}
			if (sizeof($this->errors))
			{
				if (!Tools::getValue('is_new_customer'))
					unset($_POST['passwd']);
			}
		}

		if (Tools::isSubmit('SubmitLogin'))
		{
			Module::hookExec('beforeAuthentication');
			$passwd = trim(Tools::getValue('passwd'));
			$email = trim(Tools::getValue('email'));
			
			if (empty($email))
					$this->errors[] = Tools::displayError('Account is required');
					
			if (!Validate::isEmail($email))
				$username = trim(Tools::getValue('email'));
			
			if (empty($passwd))
				$this->errors[] = Tools::displayError('Password is required');
			elseif (Tools::strlen($passwd) > 32)
				$this->errors[] = Tools::displayError('Password is too long');
			elseif (!Validate::isPasswd($passwd))
				$this->errors[] = Tools::displayError('Invalid password');
			else
			{
				
				$customer = new Customer();
				if (!Validate::isEmail($email)){
					$authentication = $customer->getByUsername(trim($username), trim($passwd));
				}else {
					$authentication = $customer->getByEmail(trim($email), trim($passwd));
				}
				$login_false = 0;
				if (!$authentication OR !$customer->id)
				{
					/* Handle brute force attacks */
					sleep(1);
					$this->errors[] = Tools::displayError('Authentication failed');
				}
				else
				{
					self::$cookie->fullname = $customer->name;
					self::$cookie->id_compare = isset(self::$cookie->id_compare) ? self::$cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
					self::$cookie->id_customer = (int)($customer->id);
					self::$cookie->customer_lastname = $customer->lastname;
					self::$cookie->customer_firstname = $customer->firstname;
					self::$cookie->logged = 1;
					self::$cookie->is_guest = $customer->isGuest();
					self::$cookie->passwd = $customer->passwd;
					self::$cookie->email = $customer->email;
					if (Configuration::get('PS_CART_FOLLOWING') AND (empty(self::$cookie->id_cart) OR Cart::getNbProducts(self::$cookie->id_cart) == 0))
						self::$cookie->id_cart = (int)(Cart::lastNoneOrderedCart((int)($customer->id)));
					/* Update cart address */
					self::$cart->id_carrier = 0;
					self::$cart->id_address_delivery = Address::getFirstCustomerAddressId((int)($customer->id));
					self::$cart->id_address_invoice = Address::getFirstCustomerAddressId((int)($customer->id));
					// If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
					self::$cart->secure_key = $customer->secure_key;
					self::$cart->update();
					Module::hookExec('authentication');
					if (!Tools::isSubmit('ajax'))
					{
						if ($back = Tools::getValue('back'))
							Tools::redirect($back);
						Tools::redirect('my-account.php');
					}
				}
			}
			
			if (Tools::isSubmit('ajax'))
			{
				$return = array(
					'hasError' => !empty($this->errors),
					'errors' => $this->errors,
					'fullname' => self::$cookie->fullname,
					'linkaccount' => $link->getPageLink('my-account.php', true),
					'logout' => $link->getPageLink('index.php'),
					'token' => Tools::getToken(false)
				);
				die(Tools::jsonEncode($return));
			}
		}
		
		if (isset($create_account))
		{
			/* Call a hook to display more information on form */
			self::$smarty->assign(array(
				'HOOK_CREATE_ACCOUNT_FORM' => Module::hookExec('createAccountForm'),
				'HOOK_CREATE_ACCOUNT_TOP' => Module::hookExec('createAccountTop')
			));
		}
		
		/* Generate years, months and days */
		if (isset($_POST['years']) AND is_numeric($_POST['years']))
			$selectedYears = (int)($_POST['years']);
		$years = Tools::dateYears();
		if (isset($_POST['months']) AND is_numeric($_POST['months']))
			$selectedMonths = (int)($_POST['months']);
		$months = Tools::dateMonths();
		$i=1;
		foreach ($months AS $value){
			switch($value)
				{
					case "January":   $months[$i] = "Tháng 1";    break;
					case "February":  $months[$i] = "Tháng 2";   break;
					case "March":     $months[$i] = "Tháng 3";     break;
					case "April":     $months[$i] = "Tháng 4";     break;
					case "May":       $months[$i] = "Tháng 5";       break;
					case "June":      $months[$i] = "Tháng 6";      break;
					case "July":      $months[$i] = "Tháng 7";      break;
					case "August":    $months[$i] = "Tháng 8";    break;
					case "September": $months[$i] = "Tháng 9"; 		break;
					case "October":   $months[$i] = "Tháng 10";   break;
					case "November":  $months[$i] = "Tháng 11";  break;
					case "December":  $months[$i] = "Tháng 12";  break;
				}
			$i++;
		}

		if (isset($_POST['days']) AND is_numeric($_POST['days']))
			$selectedDays = (int)($_POST['days']);
		$days = Tools::dateDays();
		$city = "An Giang,Bà Rịa-Vũng Tàu,Bạc Liêu,Bắc Kạn,Bắc Giang,Bắc Ninh,Bến Tre,Bình Dương,Bình Định,Bình Phước,Bình Thuận,Cà Mau,Cao Bằng,Cần Thơ,Đà Nẵng,Đắk Lắk,Đắk Nông,Điện Biên,Đồng Nai,Đồng Tháp,Gia Lai,Hà Giang,Hà Nam,Hà Nội,Hà Tĩnh,Hải Dương,Hải Phòng,Hòa Bình,Hồ Chí Minh,Hậu Giang,Hưng Yên,Khánh Hòa,Kiên Giang,Kon Tum,Lai Châu,Lào Cai,Lạng Sơn,Lâm Đồng,Long An,Nam Định,Nghệ An,Ninh Bình,Ninh Thuận,Phú Thọ,Phú Yên,Quảng Bình,Quảng Nam,Quảng Ngãi,Quảng Ninh,Quảng Trị,Sóc Trăng,Sơn La,Tây Ninh,Thái Bình,Thái Nguyên,Thanh Hóa,Thừa Thiên Huế,Tiền Giang,Trà Vinh,Tuyên Quang,Vĩnh Long,Vĩnh Phúc,Yên Bái";
		$arrCity = explode(',',$city);
		self::$smarty->assign(array(
			'city' => $arrCity,
			'years' => $years,
			'sl_year' => (isset($selectedYears) ? $selectedYears : 0),
			'months' => $months,
			'sl_month' => (isset($selectedMonths) ? $selectedMonths : 0),
			'days' => $days,
			'sl_day' => (isset($selectedDays) ? $selectedDays : 0)
		));

	}
	
	public function setMedia()
	{
		Tools::addCSS(_THEME_CSS_DIR_.'authentication.css');
		Tools::addCSS(_THEME_CSS_DIR_.'identity.css');
		Tools::addJS(_THEME_JS_DIR_.'validate.js');
	}
	

}

